package com.webserver.servlet;

import java.io.File;
import java.io.RandomAccessFile;
import java.util.Arrays;

import org.apache.log4j.Logger;

import com.webserver.http.HttpRequest;
import com.webserver.http.HttpResponse;

/**
 * 用于处理用户注册业务
 * @author pc
 *
 */
public class RegServlet extends HttpServlet{
	/*
	 * 每个需要用Log4j的类都应当声明一个静态属性，并且传入的参数是当前类的类对象
	 */
	private static Logger logger = Logger.getLogger(RegServlet.class);
	
	public void service(HttpRequest request,HttpResponse response) {
//		System.out.println("RegServlet:开始用户注册...");
		logger.info("开始用户注册...");
		/*
		 * 1:通过request获取用户在注册页面上输入的注册信息(表单提交上来的数据)
		 * 2:将该用户信息写入文件user.dat中
		 * 3:设置response响应注册结果页面给客户端
		 */
		/*
		 * 获取表单信息时，getParameter方法传入的参数要和页面上对应的输入框的名字一致
		 */
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String nickname = request.getParameter("nickname");
		String ageStr = request.getParameter("age");
		/*
		 * 必要的验证工作，当以上四项信息只要有一个是null的，就要响应一个错误页面
		 * 给客户端，提示它输入的信息有误。
		 * 实现:
		 * 1:在webapps/myweb目录下新建一个页面:reg_input_error.html
		 *   该页面上显示一行字:注册信息有误
		 *   可以在下面居中显示一个超链接，重新注册，点击后回到注册页面。
		 * 2:添加判断，如果上面四个注册信息有为null或空字符串(对内容去除空白后是空字符
		 *   串，主要防止用户只输入一个空格)时则直接响应错误页面，并且下面的注册操作
		 *   就不再执行了。 
		 */
		if(username==null||password==null||nickname==null||ageStr==null||
		   username.trim().length()==0||password.trim().length()==0||
		   nickname.trim().length()==0||ageStr.trim().length()==0) {
			File file = new File("./webapps/myweb/reg_input_error.html");
			response.setEntity(file);
			return;
		}
		int age = Integer.parseInt(ageStr);
		System.out.println(username);
		System.out.println(password);
		System.out.println(nickname);
		System.out.println(age);
		
		/*
		 * 将该用户信息写入user.dat文件，每条记录占用100字节，其中用户名，密码
		 * 昵称为字符串各占32字节，年龄为int值占4字节。
		 */
		try (
			RandomAccessFile raf = new RandomAccessFile("user.dat","rw");
		){			
			/*
			 * 首先要检查该用户是否为重复用户，在注册前读取user.dat文件中现有的
			 * 所有用户的用户名并对比，是否与本次注册的用户名一样，如果有一样的
			 * 则说明是重复用户，应当提示该用户已存在，让用户重新注册。
			 * 
			 * 实现:
			 * 1:在webapps/myweb下新建页面:have_user.html
			 *   该页面居中显示一行字:该用户已存在，请重新注册
			 *   然后下面提供一个超链接可以回到注册页面
			 * 2:顺序读取user.dat文件中的每条记录的用户名并比对，如果发现已存在
			 *   则直接响应用户已存在的提示页面，并且下面的注册操作不执行。
			 * 3:如果没有重复用户则执行下面的注册操作。
			 *   注意:没有重复用户应当是读取完user.dat文件现有所有数据后才能得出
			 *   该结论。    
			 */
			for(int i=0;i<raf.length()/100;i++) {
				raf.seek(i*100);//移动指针到该条记录的开始位置
				byte[] data = new byte[32];
				raf.read(data);
				String name = new String(data,"UTF-8").trim();
				if(name.equals(username)) {
					//重复用户!
					File file = new File("./webapps/myweb/have_user.html");
					response.setEntity(file);
					return;
				}
			}
			
			
			raf.seek(raf.length());//将指针移动到文件末尾以便追加记录
			byte[] data = username.getBytes("UTF-8");
			data = Arrays.copyOf(data, 32);//扩容到32字节
			raf.write(data);//写入32字节
			
			data = password.getBytes("UTF-8");
			data = Arrays.copyOf(data, 32);//扩容到32字节
			raf.write(data);
			
			data = nickname.getBytes("UTF-8");
			data = Arrays.copyOf(data, 32);//扩容到32字节
			raf.write(data);
			
			raf.writeInt(age);			
			//注册完毕			
			//3响应注册成功页面
			File file = new File("./webapps/myweb/reg_success.html");
			response.setEntity(file);
			
			
		} catch (Exception e) {
//			e.printStackTrace();
			logger.error(e.getMessage(),e);
		}
		
//		System.out.println("RegServlet:用户注册完毕!");
		logger.info("用户注册完毕!");
	}
}








